﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net;
using Iudicium.Tramites.CRN;
using Iudicium.Tramites;
using System.Collections;
using System.Web.Services;
using Iudicium.Utilitarios;
using System.Globalization;
using Iudicium.Servicio;
using Iudicium.Servicio.CRN;

public partial class Servicios_Tramite_FormularioTramite : System.Web.UI.Page
{
    private static readonly ILog log = LogManager.GetLogger("LogFile");

    private int TramiteId
    {
        set { TramiteIdHiddenField.Value = value.ToString(); }
        get
        {
            int TipoTramiteId = 0;
            try
            {
                TipoTramiteId = Convert.ToInt32(TramiteIdHiddenField.Value);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo convertir TramiteIdHiddenField.Value a un valor entero", ex);
            }
            return TipoTramiteId;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ObtenerParametros();
            Session["ActividadBackToUrl"] = null;
            Session["TransaccionBackToUrl"] = null;
        }
        if (TramiteId == 0)
        {
            CodigoTramitePanel.Visible = false;
            FinalizarTramiteLinkButton.Visible = false;
            EstadoPanel.Visible = false;
            FechaInicioDescripcionLabel.Visible = false;
            OptionsPanel.Visible = false;
        }
    }

    private void ObtenerParametros()
    {
        if (Session["ServicioId"] != null && !string.IsNullOrEmpty(Session["ServicioId"].ToString()))
        {
            TramiteIdHiddenField.Value = Session["ServicioId"].ToString();
            CargarDatos();
        }
        Session["ServicioId"] = null;
    }

    private void CargarDatos()
    {
        if (TramiteId <= 0)
            return;

        Tramite objTramite = null;
        try
        {
            objTramite = TramiteCRN.GetTramiteById(TramiteId);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener el tramite con id: " + TramiteId, ex);
        }
        if (objTramite == null)
            return;

        CodigoTramiteDescriptionLabel.Text = objTramite.CodigoServicio;
        CategoriaTramite objcat = null;

        try
        {
            objcat = CategoriaTramiteCRN.GetCategoriaTramiteByTipo(objTramite.TipoTramiteId);
        }
        catch(Exception ex)
        {
            log.Error("No se pudo obtener la Categoria del tramite a partir del tipo de tramite Id", ex);
        }
        if(objcat != null)
        {
            CategoriaLiteral.Text = objcat.Descripcion;
            CategoriaDropDownList.SelectedValue = objcat.CategoriaTramiteId.ToString();
        }

        MinDateLiteral.Text = "new Date(" + objTramite.FechaInicio.Year + "," + (objTramite.FechaInicio.Month - 1) + "," + objTramite.FechaInicio.Day + ")";
        TipoTramiteIdHiddenField.Value = objTramite.TipoTramiteId.ToString();
        FechaInicioDescripcionLabel.Text = objTramite.FechaInicio.ToShortDateString();
        FechaInicioDescripcionLabel.Visible = true;
        FechaEntregaEstimadaLiteral.Text = objTramite.FechaEntregaEstimada.ToShortDateString();
        FechaInicioTextBox.Visible = false;
        SelectedDateLiteral.Text = "new Date(" + objTramite.FechaEntregaEstimada.Year + "," + (objTramite.FechaEntregaEstimada.Month -1) + "," + objTramite.FechaEntregaEstimada.Day + ")";
        ObservacionTextBox.Text = objTramite.Observacion;
        DescripcionEstadoLabel.Text = objTramite.Estado;
        InvolucradosSelector.TramiteId = TramiteId;
        ResponsablesSelector.ServicioId = TramiteId;
        OptionsPanel.Visible = true;
        
        if (objTramite.Estado.Equals("Finalizado") || objTramite.Estado.Equals("Entregado"))
        {
            CancelarHyperlink.Text = "Volver a la Lista de Tramites";
            GuardarLinkButton.Visible = false;
            FinalizarTramiteLinkButton.Visible = false;
            CategoriaDropDownList.Visible = false;
            CategoriaLiteral.Visible = true;
            TipoTramiteDropDownList.Visible = false;
            TipoTramiteLiteral.Visible = true;
            InvolucradosSelector.ReadOnly = true;
            ResponsablesSelector.ReadOnly = true;
            FechaEntregaEstimadaLiteral.Visible = true;
            FechaEntregaEstimadaTextBox.Visible = false;
            ObservacionTextBox.ReadOnly = true;
            FechaFinLiteral.Text = objTramite.FechaFin.ToShortDateString();
            FechaFinalizacionPanel.Visible = true;
            try
            {
                TipoTramite objTipoTramite = TipoTramiteCRN.GetTipoTramiteById(objTramite.TipoTramiteId, objcat.CategoriaTramiteId);
                TipoTramiteLiteral.Text = objTipoTramite.Descripcion;
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener el tipo de tramite al que pertenece el tramite con id " + TramiteId, ex);
            }
            if (objTramite.Estado.Equals("Entregado"))
            {
                EntregarTramiteHyperLink.Visible = false;
                EntregadoALiteral.Text = string.IsNullOrEmpty(objTramite.EntregadoA) ? "-" : objTramite.EntregadoA;
                DescripcionObservacionEntregaTextBox.Text = string.IsNullOrEmpty(objTramite.ObservacionEntrega) ? "-" : objTramite.ObservacionEntrega;
                FechaEntregaLiteral.Text = objTramite.FechaEntrega.ToShortDateString();
                DatosEntregaPanel.Visible = true;
            }
            else
            {
                EntregarTramiteHyperLink.Visible = true;
            }
        }
        else
        {
            CancelarHyperlink.Text = "Cancelar cambios y Volver a la Lista de Tramites";
            EntregarTramiteHyperLink.Visible = false;
            FinalizarTramiteLinkButton.Visible = true;
        }
    }

    protected void GuardarLinkButton_Click(object sender, EventArgs e)
    {
        GuardarTramite();
    }

    protected void TipoTramiteDropDownList_DataBound(object sender, EventArgs e)
    {
        TipoTramiteDropDownList.Items.Insert(0, new ListItem("Seleccione una categoria de Tramite", ""));
        TipoTramiteDropDownList.SelectedValue = TipoTramiteIdHiddenField.Value;
    }

    protected void CategoriaDropDownList_DataBound(object sender, EventArgs e)
    {
        CategoriaDropDownList.Items.Insert(0, new ListItem("Seleccione una categoria de Tramite", ""));
    }

    protected void FinalizarTramiteLinkButton_Click(object sender, EventArgs e)
    {
        if (!GuardarTramite())
            return;
        DateTime fechaFin = DateTime.Now;
        try
        {
            fechaFin = Convert.ToDateTime(FechaFinalizacionHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaFinalizacionHiddenField.Value a un valor DateTime", ex);
        }
        try
        {
            ServicioCRN.FinalizarServicio(TramiteId, fechaFin);
            Notificacion.MostrarNotificacion("El tramite se ha finalizado correctamente.", Notificacion.TipoNotificacion.Alert);
        }
        catch (Exception ex)
        {
            log.Error("El tramite con id " + TramiteId + " no pudo ser finalizado", ex);
            Notificacion.MostrarNotificacion("Ocurrio un error al finalizar el tramite.", Notificacion.TipoNotificacion.Error);
            ControlNotificacion.Update();
            return;
        }
        Session["ServicioId"] = TramiteId;
        Response.Redirect("~/Servicios/Tramite/FormularioTramite.aspx");
    }

    protected void ActividadesLinkButton_Click(object sender, EventArgs e)
    {
        Session["ActividadBackToUrl"] = "~/Servicios/Tramite/FormularioTramite.aspx";
        Session["ServicioId"] = TramiteId;
        Response.Redirect("~/Servicios/Actividad/ListaActividades.aspx");
    }

    protected void TransaccionesLinkButton_Click(object sender, EventArgs e)
    {
        Session["TransaccionBackToUrl"] = "~/Servicios/Tramite/FormularioTramite.aspx";
        Session["ServicioId"] = TramiteId;
        Response.Redirect("~/Servicios/Transaccion/ListaTransacciones.aspx");
    }

    protected void EntregarTramiteLinkButton_Click(object sender, EventArgs e)
    {
        DateTime fechaFin = DateTime.Now;
        try
        {
            fechaFin = Convert.ToDateTime(FechaFinalizacionHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaFinalizacionHiddenField.Value a un valor DateTime", ex);
        }
        try
        {
            ServicioCRN.EntregarServicio(TramiteId, fechaFin, EntregadoAHiddenField.Value, ObservacionEntregaHiddenField.Value);
            Notificacion.MostrarNotificacion("El tramite se ha entregado correctamente.", Notificacion.TipoNotificacion.Alert);
        }
        catch (Exception ex)
        {
            log.Error("El tramite con id " + TramiteId + " no pudo ser finalizado", ex);
            Notificacion.MostrarNotificacion("Ocurrio un error al entregar el tramite.", Notificacion.TipoNotificacion.Error);
            ControlNotificacion.Update();
            return;
        }
        Session["ServicioId"] = TramiteId;
        Response.Redirect("~/Servicios/Tramite/FormularioTramite.aspx");
    }

    private bool GuardarTramite()
    {
        DateTime fechaInicio = DateTime.Now;
        try
        {
            fechaInicio = Convert.ToDateTime(FechaInicioTextBox.Text);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaInicioTextBox.Text a un valor de Fecha", ex);
        }

        DateTime fechaEntregaEstimada = DateTime.Now;
        try
        {
            fechaEntregaEstimada = Convert.ToDateTime(FechaEntregaEstimadaTextBox.Text);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaEntregaEstimadaTextBox.Text a un valor de Fecha", ex);
        }

        int tipoTramiteId = 0;
        try
        {
            tipoTramiteId = Convert.ToInt32(TipoTramiteIdHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir a un valor entero", ex);
        }

        Tramite objTramite = new Tramite(TramiteId,
            CodigoTramiteDescriptionLabel.Text,
            fechaInicio,
            DateTime.Now,
            fechaEntregaEstimada,
            ObservacionTextBox.Text,
            "En Proceso",
            tipoTramiteId);

        string codigo = "";
        if (TramiteId == 0)
        {
            try
            {
                int tramiteId = Iudicium.Tramites.CRN.TramiteCRN.InsertTramite(objTramite, ref codigo, InvolucradosSelector.InvolucradosInsertados);
                Notificacion.MostrarNotificacion("El tramite con Codigo: " + codigo + " se guardo correctamente.", Notificacion.TipoNotificacion.Alert);

                CodigoTramiteDescriptionLabel.Text = codigo;
                TramiteId = tramiteId;
                DescripcionEstadoLabel.Text = "En Proceso";
                CodigoTramitePanel.Visible = true;
                EstadoPanel.Visible = true;
                MinDateLiteral.Text = "new Date(" + objTramite.FechaInicio.Year + "," + (objTramite.FechaInicio.Month - 1) + "," + objTramite.FechaInicio.Day + ")";
                SelectedDateLiteral.Text = "new Date(" + objTramite.FechaEntregaEstimada.Year + "," + (objTramite.FechaEntregaEstimada.Month - 1) + "," + objTramite.FechaEntregaEstimada.Day + ")";
                FechaInicioDescripcionLabel.Text = objTramite.FechaInicio.ToShortDateString();
                FechaInicioDescripcionLabel.Visible = true;
                FechaInicioTextBox.Visible = false;
                InvolucradosSelector.TramiteId = tramiteId;

                List<ResponsableJSON> nuevosResponsables = ResponsablesSelector.NuevosResponsables;
                foreach (ResponsableJSON json in nuevosResponsables)
                {
                    if (json == null)
                    {
                        log.Error("No se pudo insertar el responsable por que el objeto JSON es nulo");
                    }

                    try
                    {
                        Responsable objResponsable = new Responsable(0, tramiteId, json.AdministrativoId, "", Convert.ToDateTime(json.FechaInicio), Convert.ToDateTime(json.FechaInicio), Responsable.EstadoResponsable.Activo);
                        ResponsableCRN.InsertResponsableActivo(objResponsable);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + json.AdministrativoId + " para el servicio " + tramiteId, ex);
                    }
                }
                ResponsablesSelector.ServicioId = tramiteId;
                ResponsablesSelector.Update();

                InvolucradosSelector.Update();
                ControlNotificacion.Update();
                OptionsPanel.Visible = true;
                FinalizarTramiteLinkButton.Visible = true;
                CancelarHyperlink.Text = "Cancelar cambios y Volver a la Lista de Tramites";
            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error al guardar los datos del tramite", ex);
                Notificacion.MostrarNotificacion("Ocurrio un error al Guardar los Datos del tramite.", Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return false;
            }
        }
        else
        {
            try
            {
                Iudicium.Tramites.CRN.TramiteCRN.UpdateTramite(objTramite, InvolucradosSelector.InvolucradosEliminados, InvolucradosSelector.InvolucradosInsertados);
                InvolucradosSelector.Update();
                //Nuevos responsables
                List<ResponsableJSON> nuevosResponsables = ResponsablesSelector.NuevosResponsables;
                foreach (ResponsableJSON json in nuevosResponsables)
                {
                    if (json == null)
                    {
                        log.Error("No se pudo insertar el responsable por que el objeto JSON es nulo");
                    }
                    Responsable objResponsable = new Responsable(0, objTramite.ServicioId, json.AdministrativoId, "", Convert.ToDateTime(json.FechaInicio), Convert.ToDateTime(json.FechaInicio), Responsable.EstadoResponsable.Activo);
                    try
                    {
                        ResponsableCRN.InsertResponsableActivo(objResponsable);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + json.AdministrativoId + " para el servicio " + objTramite.ServicioId, ex);
                    }
                }
                //Nuevos responsables inactivos
                List<ResponsableJSON> nuevosResponsablesInactivos = ResponsablesSelector.ResponsablesParaHistorial;
                foreach (ResponsableJSON json in nuevosResponsablesInactivos)
                {
                    if (json == null)
                    {
                        log.Error("No se pudo insertar el responsable por que el objeto JSON es nulo");
                    }
                    Responsable objResponsable = new Responsable(0, objTramite.ServicioId, json.AdministrativoId, "", DateTime.Now, Convert.ToDateTime(json.FechaFin), Responsable.EstadoResponsable.Inactivo);
                    try
                    {
                        ResponsableCRN.InsertResponsableInactivo(objResponsable);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + json.AdministrativoId + " para el servicio " + objTramite.ServicioId, ex);
                    }
                }
                //Responsables a eliminar
                List<int> responsablesAEliminar = ResponsablesSelector.ResponsablesEliminados;
                foreach (int id in responsablesAEliminar)
                {
                    if (id <= 0)
                    {
                        log.Error("No se pudo insertar el responsable por que el administrativoId es menor o igual que cero.");
                    }
                    try
                    {
                        ResponsableCRN.EliminarResponsableActivo(objTramite.ServicioId, id);
                    }
                    catch (Exception ex)
                    {
                        log.Error("No se pudo insertar como responsable activo al administrativo " + id + " para el servicio " + objTramite.ServicioId, ex);
                    }
                }
                ResponsablesSelector.ServicioId = objTramite.ServicioId;

                SelectedDateLiteral.Text = "new Date(" + objTramite.FechaEntregaEstimada.Year + "," + (objTramite.FechaEntregaEstimada.Month - 1) + "," + objTramite.FechaEntregaEstimada.Day + ")";
                ResponsablesSelector.Update();

                Notificacion.MostrarNotificacion("Los datos del tramite se guardaron correctamente.", Notificacion.TipoNotificacion.Alert);
                ControlNotificacion.Update();
            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error al guardar los datos del tramite", ex);
                Notificacion.MostrarNotificacion("Ocurrio un error al Guardar los Datos del tramite.", Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return false;
            }
        }
        return true;
    }

    [WebMethod]
    public static List<Iudicium.Tramites.TipoTramite> GetTipoTramites(string id)
    {
        try
        {
            List<Iudicium.Tramites.TipoTramite> lista = Iudicium.Tramites.CRN.TipoTramiteCRN.GetTipoTramiteBySearch("", id);
            return lista;
        }
        catch (Exception ex)
        {
            log.Error("No se pudo cargar los Tipos de tramites a partir de la Categoria del Tramite",ex);
        }
        return new List<Iudicium.Tramites.TipoTramite>();
    }
}
